#pragma once

#include <mcp/config.h>

namespace mcp {

// Core forward declarations
class Error;

// Types forward declarations
namespace types {
    class Value;
    class Schema;
    using RequestId = int64_t;
    using ProgressToken = int64_t;
    using Cursor = std::string;

    template<typename ParamsT, typename MethodT>
    class Request;

    template<typename ParamsT, typename MethodT>
    class Notification;

    struct Resource;
    struct Tool;
    struct Prompt;
} // namespace types

// JSON forward declarations
namespace json {
    class Value;
    class Schema;
    class JsonError;
} // namespace json

// Server forward declarations
namespace server {
    class FastMCPServer;
    class ToolManager;
    class ResourceManager;
    class PromptManager;

    template<typename ServerSessionT, typename LifespanT>
    class Context;

    class ServerSession;
} // namespace server

// Client forward declarations
namespace client {
    class ClientSession;
    class StdioClient;
    class HttpClient;
    class WebSocketClient;
} // namespace client

// Transport forward declarations
namespace transport {
    class Transport;
    class StdioTransport;
    class HttpTransport;
    class WebSocketTransport;
    class SseTransport;
    class StreamableHttpTransport;
} // namespace transport

// Auth forward declarations
namespace auth {
    class OAuthClientProvider;
    class TokenVerifier;
    class TokenStorage;
    class InMemoryTokenStorage;
    class JwtTokenVerifier;
} // namespace auth

// Shared forward declarations
namespace shared {
    template<typename T> class ObjectPool;
    class StringInterner;
    template<typename T> class Cache;
} // namespace shared

// Error handling
namespace error {
    enum class ErrorCode;
    class Error;
} // namespace error

} // namespace mcp